﻿// Inner Fire 游戏引擎库
// 光源类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 处理光源相关的信息
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-02

#pragma once

#include <dx/core/dx_core.h>
#include <xml_reader.h>

namespace ifire::dx {

enum class LightType : int { Directional = 0, Point, Spot };

/*
 * 光源信息
 * 这个排列的顺序不能更改，是有意义的。因为HLSL的结构体封装规则使用填充对齐。
 * 要将结构体中的元素打包为一个Vector4向量。而如果用一个Vector3+float就可以成功打包。
 */
struct Light {
  // 光源的颜色
  XMFLOAT3 color = {0.5f, 0.5f, 0.5f};
  // 用于Point和Spot
  float falloff_start = 1.0f;
  // 光源的方向，用于directional和Spot
  XMFLOAT3 direction = {0.0f, -1.0f, 0.0f};
  // 光源的有效（最大）距离。用于Point和Spot
  float falloff_end = 10.0f;
  // 用于Point和Spot
  XMFLOAT3 position = {0.0f, 0.0f, 0.0f};
  // 仅用于SpotLight
  float spot_power = 64.0f;
};

struct LightSetting {
  LightType type;
  bool disable;
  Light light;

  LightSetting() = default;
  LightSetting(const ikit::XmlNode& node, int index);
};


} // namespace ifire::dx